package com.shiroha.common.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.*;

@MappedTypes({Object[].class})
@MappedJdbcTypes(JdbcType.ARRAY)
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType) throws SQLException {
        // 将 Java 数组转换为 PostgreSQL 数组
        Array sqlArray = ps.getConnection().createArrayOf("text", parameter);
        ps.setArray(i, sqlArray);
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从 ResultSet 中获取 PostgreSQL 数组并转换为 Java 数组
        Array array = rs.getArray(columnName);
        return array != null ? (Object[]) array.getArray() : null;
    }

    @Override
    public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从 ResultSet 中通过列索引获取 PostgreSQL 数组并转换为 Java 数组
        Array array = rs.getArray(columnIndex);
        return array != null ? (Object[]) array.getArray() : null;
    }

    @Override
    public Object[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从 CallableStatement 中获取 PostgreSQL 数组并转换为 Java 数组
        Array array = cs.getArray(columnIndex);
        return array != null ? (Object[]) array.getArray() : null;
    }
}
